package com.thinkgem.jeesite.modules.brain.common;

import com.google.common.collect.ImmutableMap;
import com.thinkgem.jeesite.common.utils.SpringContextHolder;
import com.thinkgem.jeesite.modules.brain.entity.BRankDic;
import com.thinkgem.jeesite.modules.brain.entity.BUserDailystatusData;
import com.thinkgem.jeesite.modules.brain.entity.BUserOrprInfo;
import com.thinkgem.jeesite.modules.sys.utils.UserUtils;
import org.springframework.core.task.TaskExecutor;

import java.util.Map;

//内部使用
public  class UserStatusUtil {

    public static final String ThreadUserStatusBrainKey="33023kmifam";

    //獲取當前用戶狀態
    public static BUserDailystatusData getCurrUserstatus(){

        // 可從緩存查詢  若要使用緩存得注意緩存的增刪改查 以及持久化的問題
        return (BUserDailystatusData)UserUtils.getSession().getAttribute(ThreadUserStatusBrainKey);
    }
    //賬戶是否正常
    public static  boolean isUsernormal(){
       return  getCurrUserstatus().getStatus()>1;
        
    }
    
    //今日剩下參與聯係賽的次數
    public static int timesRemainForPractice(){
        
        
        return isUsernormal()?0:getCurrUserstatus().getPraticeRemaintimes();
    }

    //今日剩下參與排位賽的次數
    public static int timesRemainForRank(){


        return isUsernormal()?0:getCurrUserstatus().getRankRemaintimes();
    }
    
    
    //是否可以參加練習賽
    public static boolean isAllowpratice(){
        
        return  isUsernormal()&&Boolean.getBoolean(getCurrUserstatus().getIsallowpratice());
                
    }
    //是否可以參加排位賽
    public static boolean isAllowRank(){

        return  isUsernormal()&&Boolean.getBoolean(getCurrUserstatus().getIsallowrank());

    }

    //用户状态改变
        //答题完毕
    public static void changeStatusAfterAnswer(MatchType type,BUserOrprInfo record){

        BUserDailystatusData curr= getCurrUserstatus();

        //逻辑处理
        if(type.equals(MatchType.practice)){
            curr.setPraticeAcrossTimes(curr.getPraticeTimes()+1);  //练习次数+1
             if(record.getIscross().equalsIgnoreCase("1"))
                  curr.setPraticeAcrossTimes(curr.getRankAcrossTimes()+1); //通过次数+1
             else 
                 curr.setPraticeFailureTimes(curr.getPraticeFailureTimes()+1);//失败次数+1;
            
            if(curr.getPraticeRemaintimes()!=null){                     //  剩余局数不为无限
                curr.setPraticeRemaintimes(curr.getPraticeRemaintimes()-1);//剩余局数-1;
                
                if(curr.getPraticeRemaintimes()<1){                   
                    curr.setIsallowpratice("0");                      // 不允许参加训练
                    curr.setPraticeMessahe("您今天的练习次数已经用完");   // 生成练习提示信息
                }
            }
            
        }else if(type.equals(MatchType.rank)){   //同练习
            
            curr.setRankAcrossTimes(curr.getRankTimes()+1);  //练习次数+1
            if(record.getIscross().equalsIgnoreCase("1"))
                curr.setRankAcrossTimes(curr.getRankAcrossTimes()+1); //通过次数+1
            else
                curr.setRankFailureTimes(curr.getRankFailureTimes()+1);//失败次数+1;

            if(curr.getRankRemaintimes()!=null){                     //  剩余局数不为无限
                curr.setRankRemaintimes(curr.getRankRemaintimes()-1);//剩余局数-1;

                if(curr.getRankRemaintimes()<1){
                    curr.setIsallowpratice("0");                      // 不允许参加训练
                    curr.setRankMessage("您今天的练习次数已经用完");   // 生成排位提示信息
                }
            }
        }

    }
    //返回剩余星级和排位等级,是否升级 降级

    public static Map changeRankStarAndReturnInfo(BUserOrprInfo record){
        //校验是否排位赛

       if( Integer.parseInt(record.getPraticeType())==MatchType.rank.getType())
           return null;


        BRankDic breforBrankDic= UserConfigUtil.getCurrRank();  //之前的
           //是否通过
            //获取所有星星
          int allStars= AllPASS.equalsIgnoreCase(record.getIscross())?starAdd():starSubtract();


        BRankDic currBrankDic= UserConfigUtil.getCurrRank();

        return ImmutableMap.of("level",currBrankDic,"Levelstars",UserConfigUtil.getLevelRemainStar(),"levelChange ",currBrankDic.getRankSort()-breforBrankDic.getRankSort(),"allStars",allStars);
    }

    private  static final String AllPASS="1";

    //扣除星星
    //返回剩余星星
    private static int starSubtract(){

        return starSubtract(1);
    }
    private static int starSubtract(int count){


        BUserDailystatusData curr= getCurrUserstatus();
        return    curr.setStarNumSubtract(count);
        //每次登出 和 退出程序时  插入库

    }
    //返回剩余星星
    //添加星级

    private  static int starAdd(){

        return starAdd(1);
    }
    private  static int starAdd(int  count){

        BUserDailystatusData curr= getCurrUserstatus();
        return   curr.setStarNumAdd(count);
        //登录时保存到session attribute那里
        //使用了ehcache 缓存
        //这个需要队列入库  因为排行榜需要实时

        //每次登出 和 退出程序时  插入库

    }
}

